export const newWebSocket = {
  websocket: null,
  pink_timer: null, // 用于心跳检测
  active_close: false, // 是否主动关闭
  userId: null,
  toUserId: null,

  // 初始化 webSocket
  init: (params) => {
    console.log();

    // 判断是否传入了当前登录 id 如果没有传入登录 id 将不会创建 websocket 连接
    if (!(params.userId)) return

    // webSocket 地址
    newWebSocket.websocket = new WebSocket(params.url)

    // 打开后的方法
    newWebSocket.websocket.onopen = (data) => {
      newWebSocket.pink({
        userId: params.userId
      })
      // 将登录 id 进行 保存
      newWebSocket.userId = params.userId
      newWebSocket.toUserId = params.toUserId
      if (params.onopen) {
        params.onopen('webSocket已连接', data)
      }
    }

    // 接收数据的方法
    newWebSocket.websocket.onmessage = (data) => {
      if (params.onmessage) {
        params.onmessage(data.data)
      }
    }

    // 发送数据的方法
    newWebSocket.websocket.onsend = (data) => {
      if (params.onsend) {
        newWebSocket.websocket.send([params.userId, data])
      }
    }

    // 关闭连接的方法
    newWebSocket.websocket.onclose = () => {
      clearInterval(newWebSocket.pink_timer)
      if (newWebSocket.active_close) {
        if (params.onclose) {
          params.onclose('连接已手动关闭')
        }
      } else {
        newWebSocket.reconnect(params)
        if (params.onclose) {
          params.onclose('连接已关闭, 正在重连')
        }
      }
    }

    // 发生错误
    newWebSocket.websocket.onerror = () => {
      clearInterval(newWebSocket.pink_timer)
      if (params.onerror) {
        params.message('连接发生错误！等待五秒后重连')
        setTimeout(() => {
          newWebSocket.reconnect(params)
        },5000)
      }
    }
  },

  // 发送数据
  send: (data = '') => {
    // 判断当前是否处于连接状态 并且 传入了要发送的id
    if(newWebSocket.websocket.readyState === 1) {
      if(!!newWebSocket.toUserId) {
        let edata = {
          userId: newWebSocket.userId,
          toUserId: newWebSocket.toUserId,
          message: data
        }
        newWebSocket.websocket.send(JSON.stringify(edata))
      } else {
        console.log('发送人不能为空');
      }
    } else {
      console.log('当前 websocket 未连接');
    }
  },

  // 心跳检测
  pink: () => {
    if (newWebSocket.pink_timer) {
      clearInterval(newWebSocket.pink_timer)
    }
    newWebSocket.pink_timer = setInterval(function (){
      newWebSocket.websocket.send('pink')
    },8000)
  },

  // 重新连接 
  reconnect: (params) => {
    console.log('执行重连')
    newWebSocket.active_close = false
    if (newWebSocket.websocket) {
      newWebSocket.websocket.close()
    }
    newWebSocket.init(params)
  },

  // 断开连接
  close: () => {
    console.log('手动关闭，无需重连')
    clearInterval(newWebSocket.pink_timer)
    newWebSocket.active_close = true
    newWebSocket.websocket.close()
  },

  // 查看 websocket 连接地址
  lookUrl: () => {
    console.log(newWebSocket.websocket.url);
    return newWebSocket.websocket.url
  }
}